﻿#pragma once
#include <cstdint>
#include <fstream>
#include <string>
#include <vector>

namespace ikit {

class CachedFile {
protected:
  std::fstream file; // 文件流对象
  std::string path;  // 文件路径

public:
  // 打开模式（兼容标准ios模式）
  enum OpenMode {
    Read = std::ios::in | std::ios::binary,
    Write = std::ios::out | std::ios::binary,
    Append = Write | std::ios::app
  };

  // 构造函数/析构函数
  CachedFile() = default;
  virtual ~CachedFile() { close(); }

  // 基础文件操作
  bool open(const std::string& filePath, OpenMode mode);
  void close();
  bool isOpen() const { return file.is_open(); }

  // 基础数据类型读写
  bool writeInt(int32_t value);
  bool writeFloat(float value);
  bool writeBytes(const void* data, size_t size);

  int32_t readInt();
  float readFloat();
  bool readBytes(void* outData, size_t size);

  // 字符串操作
  bool writeString(const char* str); // 写入C风格字符串
  const char* readString(char* outStr); // 读取到预分配缓冲区
  std::string readString(); // 读取到std::string

  // 辅助功能
  size_t getFileSize();
  std::string getFilePath() const { return path; }

  // 禁止拷贝
  CachedFile(const CachedFile&) = delete;
  CachedFile& operator=(const CachedFile&) = delete;

  // 新增静态方法
  static std::string GetCachedFileName(
      const std::string& filename, const std::string& cached_folder = "cached");
  // 在这里进行两个文件的比较，如果cached_filename不存在，或者filename的修改时间比较新，
  // 表示要重新建立缓存，返回False，否则返回True。
  static bool IsCachedValid(
      const std::string& filename, const std::string& cached_filename);
};

} // namespace ikit